//exchange.c
long exchange(long *xp, long y){
    long x = *xp;
    *xp = y;
    return x;
}

/*

0000000000000000 <exchange>:
   0:   f3 0f 1e fa             endbr64 
   // xp in %rdi, y in %rsi, 根据寄存器使用惯例是这样的，
   //而汇编代码一般不会显式的展示这个过程
   4:   48 8b 07                mov    (%rdi),%rax
   // 上面这个指令，是从内存中读取数值 到寄存器，
   // rdi存储的内容 是一个指针变量的值，也就是xp的地址，
   // 所以这里做的事情就是 根据xp指针的值 进行寻址, 
   // 然后mov (%rdi), %rax 相当于C代码当中的long x = *xp;
   // 由于最后的返回值是x，所以x的值被放到rax当中
   7:   48 89 37                mov    %rsi,(%rdi)
   // 这一句对应的是 movq %rsi, (%rdi)
   // 也就是把变量y的值写到内存里
   // y的值存储在寄存器rsi中， 然后写到内存，也就是写到xp位置的数值
   a:   c3                      ret    


*/





// gcc -Og -S exchange.c
// gcc -Og -c exchange.c

// then:
// objdump -d exchange.o

/*


vincentzyu@vincentzyu:~/Documents/playfield/exchange$ objdump -d exchange.o

exchange.o：     文件格式 elf64-x86-64


Disassembly of section .text:

0000000000000000 <exchange>:
   0:   f3 0f 1e fa             endbr64 
   4:   48 8b 07                mov    (%rdi),%rax
   7:   48 89 37                mov    %rsi,(%rdi)
   a:   c3                      ret    

*/




// xp in %rdi, y in %rsi, 根据寄存器使用惯例是这样的，
   //而汇编代码一般不会显式的展示这个过程

